package controller

import (
	"appService/src/application"
	"appService/src/application/app/appModels"
	"appService/src/authValid/userMap"
	"appService/src/libs/crypot"
	"appService/src/orm"
	"github.com/gogf/gf/frame/g"
	"github.com/gogf/gf/net/ghttp"
	"xorm.io/builder"
)

//Account 账号管理
type Account struct {
	application.BaseController
}
//getModel 获取控制器对应的 模型
func  (*Account)getModel() appModels.IModel{
	return new(appModels.Account)
}
//EditUserInfo 个人中心 -> 修改基本资料
func (this *Account) EditUserInfo(r *ghttp.Request) {
	req:=this.NewRequest(r,this.getModel())
	id := r.GetString("id")
	p := struct {
		Nickname string `json:"nickname"` // 用户昵称
		Username string `json:"username"` // 用户名称
		Mobile   string `json:"mobile"`   // 手机号码
		Email    string `json:"email"`    // 电子邮箱
		Province string `json:"province"` // 省份
		City     string `json:"city"`     // 城市
	}{}
	req.ParamsAnalyse(&p)
	if id == "" {
		req.JsonError("修改失败，无法查询用户")
	}
	if id != req.LoginUser.Account.Id {
		req.JsonError("修改失败，只能修改自己的基本资料")
	}
	a := new(appModels.Account)
	a.Nickname = p.Nickname
	a.Username = p.Username
	a.Mobile = p.Mobile
	a.Email = p.Email
	a.Province = p.Province
	a.City = p.City
	db := orm.Db.Where(builder.Eq{"id": req.LoginUser.Account.Id})
	_, err := db.Update(a)
	if err == nil {
		user := new(appModels.Users)
		db:= orm.Db.Where(builder.Eq{"uid": req.LoginUser.User.Uid})
		ok, err :=db.Get(user)
		if err != nil {
			g.Log().Errorf("EditUserInfo：修改基本资料 —> 查询用户信息错误：%v", err)
			req.JsonReLogin("基本资料修改成功，您的令牌已失效，请重新登录")
		}
		if !ok {
			g.Log().Errorf("EditUserInfo：修改基本资料 —> 用户【UID=%v】不存在", req.LoginUser.User.Uid)
			req.JsonReLogin("基本资料修改成功，您的令牌已失效，请重新登录")
		}
		account := new(appModels.Account)
		db = orm.Db.Where(builder.Eq{"id": user.AccountId})
		ok, err = db.Get(account)
		if err != nil {
			g.Log().Errorf("EditUserInfo：修改基本资料 —> 查询用户账号信息错误：%v", err)
			req.JsonReLogin("基本资料修改成功，您的令牌已失效，请重新登录")
		}
		if !ok {
			g.Log().Errorf("EditUserInfo：修改基本资料 —> 用户账号【ID=%v】不存在", user.AccountId)
			req.JsonReLogin("基本资料修改成功，您的令牌已失效，请重新登录")
		}
		req.LoginUser.Account = *account
		req.LoginUser.User = *user
		userMap.Set(req.LoginUser)
		req.JsonSuccess("修改成功", req.LoginUser)
	} else {
		g.Log().Errorf("EditUserInfo: -> 修改用户基本资料，错误：%v", err)
		req.JsonError("修改失败")
	}
}

//EditUserPassWord 个人中心 -> 修改登录密码
func (this *Account) EditUserPassWord(r *ghttp.Request) {
	req:=this.NewRequest(r,this.getModel())
	id := r.GetString("id")
	p := struct {
		OldPassWord string `json:"oldPassWord"` // 老密码
		NewPassWord string `json:"newPassWord"` // 新密码
	}{}
	req.ParamsAnalyse(&p)
	if p.OldPassWord == "" {
		req.JsonError("旧密码，不能为空")
	}
	if p.NewPassWord == "" {
		req.JsonError("新密码，不能为空")
	}
	if id == "" {
		req.JsonError("修改失败，无法查询用户")
	}
	if id != req.LoginUser.Account.Id {
		req.JsonError("修改失败，只能修改自己的登录密码")
	}
	oldPassWord := crypot.PassWordEncryption(p.OldPassWord)
	if req.LoginUser.Account.Password != "" {
		if oldPassWord != req.LoginUser.Account.Password {
			req.JsonError("旧密码错误")
		}
	} else {
		a := new(appModels.Account)
		db := orm.Db.Where(builder.Eq{"id": req.LoginUser.Account.Id})
		has, err := db.Get(a)
		if err != nil {
			g.Log().Errorf("EditUserPassWord：查询用户账号，错误：%v", err)
			req.JsonError("修改失败")
		}
		if !has {
			req.JsonError("用户信息不存在")
		}
		if oldPassWord != a.Password {
			req.JsonError("旧密码错误")
		}
	}

	a := new(appModels.Account)
	a.Password = crypot.PassWordEncryption(p.NewPassWord)
	db := orm.Db.Where(builder.Eq{"id": req.LoginUser.Account.Id})
	_, err := db.Cols("password").Update(a)
	if err == nil {
		req.JsonSuccess("修改成功")
	} else {
		g.Log().Errorf("EditUserPassWord: -> 修改登录密码，错误：%v", err)
		req.JsonError("修改失败")
	}
}

func (this *Account) Add(r *ghttp.Request) {
	this.NewRequest(r,this.getModel()).Add()
}
func (this *Account) Delete(r *ghttp.Request) {
	this.NewRequest(r,this.getModel()).Delete()
}
func (this *Account) Edit(r *ghttp.Request) {
	this.NewRequest(r,this.getModel()).Edit()
}
func (this *Account) ListPaginate(r *ghttp.Request) {
	this.NewRequest(r,this.getModel()).ListPaginate()
}